home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
cv_set6
/
cv_set6s.lzh
/
BMP2RGB.S
< prev
next >
Wrap
Text File
|
1997-09-28
|
46KB
|
2,176 lines
*********************************************************************************
* BMP to RGB converter <BMP2RGB.X Ver0.01> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
WIN3 equ 40
OS2v1 equ 12
OS2v2 equ 64
file_header:
f_type: equ 0 *ファイル識別子 'BM'
f_size: equ 2 *ファイルのサイズ
f_reserved1: equ 6 *予備1
f_reserved2: equ 8 *予備2
f_offbits: equ 10 *ファイル先頭からイメージデータへのオフセット
WIN3_HED:
win3_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
win3_width: equ 18 *横サイズ
win3_height: equ 22 *縦サイズ
win3_planes: equ 26 *使用プレーン数
win3_bitcount: equ 28 *色数 (1:2色,4:16色,8:256色,24:16777216色)
win3_comp: equ 30 *圧縮アルゴリズム (0:無圧縮,1:rle8,2:RLE4)
win3_size_image equ 34 *イメージデータのサイズ
win3_xpels_pm: equ 38 *X方向のディスプレイ分解能
win3_ypels_pm: equ 42 *Y方向のディスプレイ分解能
win3_clr_used: equ 46 *色変換テーブルの大きさ
win3_clr_imp: equ 50 *重要な色の数
OS21_HED:
os21_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
os21_width: equ 18 *横サイズ
os21_height: equ 20 *縦サイズ
os21_planes: equ 22 *使用プレーン数
os21_bitcount: equ 24 *色数 (1:2色,4:16色,8:256色,24:16777216色)
.text
.even
start:
lea.l mysp(pc),sp *スタックセット
lea.l work(pc),a6
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
bsr cmdchk *コマンドラインの解析
bsr s_name_chk *セーブファイル名のチェック
bsr buf_get *バッファ確保
bsr name_get *ファイル名を取得し処理する
bsr buf_free *バッファ開放
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt(a6) *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg1(a6) *
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
pea.l filbuf(a6) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg1(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg1(a6),a0 *バッファargに
lea.l nambuf(a6),a1 * nameckで展開したパス名+'*.BMP'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg1(a6) * 検索してみる
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg1(a6),a0 *バッファarg1に
lea.l komekome(pc),a1 * もとのファイル名+'\*.BMP'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* 出力パス名をチェックする *
*****************************************************************
s_name_chk:
lea.l arg2(a6),a0 *出力パス名を指定したか?
tst.b (a0)
beq s_name_chk8 *してない
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg2(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi out_name_err * パス名の指定に誤りがある
beq s_name_chk1 *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne out_name_err * ワイルドカード指定あり
s_name_chk1:
lea.l arg2(a6),a0 *ドライブ名を指定しているか?
cmp.b #':',1(a0)
bne out_name_err *ドライブ名の指定に誤りがある
tst.b 2(a0) *ドライブ名のみか
bne s_name_chk2 *違う
addq.l #2,a0
bra s_name_chk9
s_name_chk2:
moveq.l #0,d0 *セーブ先ドライブ番号を求める
move.b (a0),d0
bsr toupper
sub.b #'A',d0
add.b #1,d0
lea.l spathbuf(a6),a1 *セーブ先ドライブ名
move.b (a0),(a1)+
move.b #':',(a1)+
move.b #'\',(a1)+
move.l a1,-(sp) *セーブ先パスをセーブ
move.w d0,-(sp)
DOS _CURDIR
addq.l #6,sp
lea.l cpathbuf(a6),a2 *カレントパスをセーブしておく
DOS _CURDRV
add.b #"A",d0
move.b d0,(a2)+
move.b #':',(a2)+
move.b #'\',(a2)+
move.l a2,-(sp)
move.w #0,-(sp)
DOS _CURDIR
addq.l #6,sp
pea.l arg2(a6) *コマンドラインで指定されたパスへ
DOS _CHDIR * 移動してみる
addq.l #4,sp
tst.l d0 *d0が0でなければ
bmi out_name_err * パス名の指定に誤りがある
pea.l spathbuf(a6) *セーブ先パスを戻す
DOS _CHDIR
addq.l #4,sp
pea.l cpathbuf(a6) *カレントパスに戻す
DOS _CHDIR
addq.l #4,sp
lea.l arg2(a6),a0 *
bsr set_en *パス名の最後に\マークをセット
bra s_name_chk9
s_name_chk8:
lea.l arg2(a6),a0
s_name_chk9:
move.l a0,nameichi(a6)
rts
*****************************************************************
* パス名に¥マークを連結する *
*****************************************************************
set_en:
tst.b (a0)+ *(a0)は0か?
bne set_en *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
cmp.b #"\",-1(a0) *一番最後の文字が¥か
beq set_en_ * ¥ならばスキップ
move.b #'\',(a0)+ * ¥をセット
set_en_:
rts
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg1以降に格納する *
*****************************************************************
setpath:
lea.l arg1(a6),a0 *a0=コピー先
lea.l nambuf(a6),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(a6),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg1(a6),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg1(a6),a0 *a0=引数切り出し領域
clr.b 256(a0) *出力ファイル名をちょっと初期化
addq.l #1,a2 *a2=コマンドライン文字列先頭
sf nflg(a6) *NスイッチOFF
sf hflg(a6) *HスイッチOFF
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
lea.l 256(a0),a0 *a0=a0+256
bsr switch_chk *さらにスイッチのチェック
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'N',d0
beq nsw
cmpi.b #'H',d0
beq hsw
bra usage *無効なスイッチが指定された
nsw:
tst.b nflg(a6)
bne usage
st nflg(a6)
bra switch_chk
hsw:
tst.b hflg(a6)
bne usage
st hflg(a6)
bra switch_chk
switch_chk2:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
clr.w line_cnt(a6) *ラインカウント初期化
sf skip_flg(a6) *スキップフラグ初期化
lea.l arg1(a6),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
move.l d6,fi_size(a6)
movea.l buff_addr(a6),a5 *ヘッダを読み込む
moveq.l #14+64,d6
bsr file_read
bsr file_chk *コンバートできるか調べる
tst.b skip_flg(a6)
bne main9
bsr line_byte_set *1ラインのバイト数を調べる
bsr mem_chk *メモリが足りるか調べる
tst.b skip_flg(a6)
bne main9
bsr pal_set *パレットデータ作成
bsr convert *コンバート
addq.w #1,file_cnt(a6)
main9:
bsr file_close1
rts
*****************************************************************
* ファイルヘッダから画像サイズを求める *
*****************************************************************
file_chk:
movea.l buff_addr(a6),a0 *読み込んだデータの先頭
tst.b hflg(a6)
bne file_chk1
cmp.w #'BM',f_type(a0) *ファイル識別子はあっているか
beq file_chk1
bsr file_er *BMPファイルではない
bra file_chk9
file_chk1:
move.l f_offbits(a0),d0 *offbitsセーブ
bsr i_to_m
move.l d0,offbits(a6)
* move.l f_size(a0),d0 *ファイルサイズセーブ
* bsr i_to_m
* move.l d6,fi_size(a6)
move.l win3_size(a0),d0 *BMPの種類
bsr i_to_m
move.w d0,os_type(a6)
cmp.w #OS2v1,d0 *OS/2 1.x
beq os21_chk
cmp.w #WIN3,d0 *Win 3.x
beq win3_chk
cmp.w #OS2v2,d0 *OS/2 2.x(Win3チェックで動くと思う)
beq win3_chk
bsr no_support_err
bra file_chk9
*****************************************************************
* OS/2 1.xのサイズを求める *
*****************************************************************
os21_chk:
move.w os21_planes(a0),d0 *使用プレーン数は1か
ror.w #8,d0
cmp.w #1,d0
beq os21_chk0
bsr no_support_err
bra file_chk9
os21_chk0:
move.w os21_bitcount(a0),d0 *使用色数GET
ror.w #8,d0
move.w d0,iro(a6)
cmp.w #1,d0 *2
beq os21_chk1
cmp.w #4,d0 *16
beq os21_chk1
cmp.w #8,d0 *256
beq os21_chk1
cmp.w #24,d0 *Full
beq os21_chk1
bsr but_col_err *それ以外は無視*
bra file_chk9
os21_chk1:
move.w os21_width(a0),d0 *横ドット数求める
ror.w #8,d0
move.w d0,yoko(a6)
move.w os21_height(a0),d0 *縦ドット数求める
ror.w #8,d0
move.w d0,tate(a6)
cmp.w #24,iro(a6)
beq os21_chk2
move.l os21_size(a0),d0 *パレット数を求める
bsr i_to_m
move.l offbits(a6),d1
sub.l d0,d1
sub.l #14,d1
divu.w #3,d1 *おそい
move.w d1,pal_cnt(a6)
move.l a0,a1 *パレットデータのアドレス
adda.l d0,a1
adda.l #14,a1
move.l a1,pal_addr(a6)
os21_chk2:
move.l buff_addr(a6),gr_addr(a6) *変換後画像アドレス
clr.w compress(a6)
rts
*****************************************************************
* WIN3.xのサイズを求める *
*****************************************************************
win3_chk:
move.w win3_planes(a0),d0 *使用プレーン数は1か
ror.w #8,d0
cmp.w #1,d0
beq win3_chk1
bsr no_support_err
bra file_chk9
win3_chk1:
move.w win3_bitcount(a0),d0 *使用色数GET
ror.w #8,d0
move.w d0,iro(a6)
cmp.w #1,d0 *2
beq win3_chk2
cmp.w #4,d0 *16
beq win3_chk2
cmp.w #8,d0 *256
beq win3_chk2
cmp.w #16,d0 *32k
beq win3_chk2
cmp.w #24,d0 *Full
beq win3_chk2
bsr but_col_err *それ以外は無視*
bra file_chk9
win3_chk2:
move.l win3_comp(a0),d0 *圧縮モード
bsr i_to_m
move.w d0,compress(a6)
move.l win3_width(a0),d0 *横ドット数求める
bsr i_to_m
move.w d0,yoko(a6)
move.l win3_height(a0),d0 *縦ドット数求める
bsr i_to_m
move.w d0,tate(a6)
cmp.w #24,iro(a6) *フルカラーの時
beq win3_chk3
move.l win3_size(a0),d0 *パレット数を求める
bsr i_to_m
move.l offbits(a6),d1
sub.l d0,d1
sub.l #14,d1
lsr.l #2,d1
move.w d1,pal_cnt(a6)
movea.l a0,a1 *パレットの先頭アドレスを求める
adda.l d0,a1
adda.l #14,a1
move.l a1,pal_addr(a6)
win3_chk3:
move.l buff_addr(a6),gr_addr(a6) *変換後画像アドレス
rts
file_chk9: *スキップする画像の時
bsr file_close1
st skip_flg(a6)
rts
*****************************************************************
* メモリチェック *
*****************************************************************
mem_chk:
cmp.w #16,iro(a6) *16bitBMP
beq mem_chk2
tst.w compress(a6)
bne mem_chk1 *rle4 or 8
mem_chk0:
moveq.l #0,d0 *ベタは最低1ライン
move.w line_byte1(a6),d0
add.w line_byte2(a6),d0
bra mem_chk3
mem_chk1:
move.w line_byte1(a6),d0 *RLE圧縮はオンメモリ
add.w line_byte2(a6),d0
mulu.w tate(a6),d0
move.w line_byte2(a6),d1
mulu.w tate(a6),d1
add.l fi_size(a6),d1
cmp.l d0,d1
bls mem_chk1_
move.l d1,d0
mem_chk1_:
bra mem_chk3
mem_chk2:
move.w line_byte1(a6),d0 *16bitBMPもオンメモリ
add.w line_byte2(a6),d0
mulu.w tate(a6),d0
add.l fi_size(a6),d0
mem_chk3:
cmp.l buff_size(a6),d0
bls mem_chk4
bsr no_buff
bsr file_close1
st skip_flg(a6)
mem_chk4:
rts
i_to_m:
ror.w #8,d0
swap.w d0
ror.w #8,d0
rts
*****************************************************************
* 1ラインのバイト数を求める *
*****************************************************************
line_byte_set:
move.w iro(a6),d0
cmp.w #4,d0
bcs lb_set1
beq lb_set4
cmp.w #16,d0
bcs lb_set8
beq lb_set16
bhi lb_set24
lb_set1:
move.w yoko(a6),d0
add.w #31,d0
lsr.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte1(a6)
bra line_byte_set9
lb_set4:
move.w yoko(a6),d0
addq.w #7,d0
lsr.w #1,d0
and.w #$fffc,d0
move.w d0,line_byte1(a6)
bra line_byte_set9
lb_set8:
move.w yoko(a6),d0
addq.w #3,d0
andi.w #$fffc,d0
move.w d0,line_byte1(a6)
bra line_byte_set9
lb_set16:
move.w yoko(a6),d0
add.w d0,d0
addq.w #3,d0
andi.w #$fffc,d0
move.w d0,line_byte1(a6)
bra line_byte_set9
lb_set24:
move.w yoko(a6),d0
move.w d0,d1
add.w d1,d1
add.w d1,d0
addq.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte1(a6)
line_byte_set9:
move.w yoko(a6),d0
move.w d0,d1
add.w d1,d1
add.w d1,d0
move.w d0,line_byte2(a6)
rts
*****************************************************************
* コンバート *
*****************************************************************
convert:
tst.w compress(a6) *圧縮ファイルは展開する
beq convert0
bsr tenkai
convert0:
bsr prt0
bsr prt1
bsr save_name_set *書き込むファイル名作成
bsr ipr_set *IPRファイル作成
lea.l arg2(a6),a0 *RGBファイル作成
bsr file_create
move.w line_byte1(a6),d0 *一回に変換できるライン数(d3)を求める
add.w line_byte2(a6),d0
move.l buff_size(a6),d3
divu.w d0,d3
cmp.w tate(a6),d3 *一回で変換できるか
bls convert1 *できない
move.w tate(a6),d3
moveq.l #1,d4
moveq.l #0,d5
bra convert2
convert1:
moveq.l #0,d5 *繰り返し数(d4)と残り(d5)を求める
move.w tate(a6),d5
divu.w d3,d5
move.w d5,d4
swap d5
convert2:
move.w line_byte1(a6),d0 *変換先アドレスを求める
mulu.w d3,d0
add.l buff_addr(a6),d0
move.l d0,gr_addr(a6)
bsr convert4
tst.w d5 *半端分があるか
beq convert3 *ない
moveq.l #1,d4 *最後のコンバート
move.w d5,d3
bsr convert4
convert3:
move.w out_file(a6),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
bsr prt3
rts
convert4:
subq.w #1,d4
convert4_:
tst.w compress(a6)
bne convert5
bsr get_seek *シーク位置(d0)求める
bsr file_seek
movea.l buff_addr(a6),a5 *読み込み
move.w line_byte1(a6),d6
mulu.w d3,d6
bsr file_read
convert5:
move.w d3,d7 *コンバート
bsr gr_conv
move.l gr_addr(a6),a5 *書き込み
move.w line_byte2(a6),d6
mulu.w d3,d6
bsr file_write
dbra.w d4,convert4_ *繰り返し
rts
get_seek: *シーク位置(d0)求める
move.w tate(a6),d0
move.w line_cnt(a6),d1
add.w d3,d1
sub.w d1,d0
mulu.w line_byte1(a6),d0
add.l offbits(a6),d0
rts
file_seek: *指定位置(d0)にシーク
move.w #0,-(sp) *シークモード
move.l d0,-(sp) *オフセット
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0
bmi read_err
rts
*****************************************************************
* 画像コンバート *
*****************************************************************
gr_conv:
subq.w #1,d7 *繰り返し数
move.l buff_addr(a6),a0 *変換元
move.w d7,d0
mulu.w line_byte1(a6),d0
adda.l d0,a0
move.l gr_addr(a6),a2 *変換先
move.w iro(a6),d0
cmp.w #4,d0
bcs bit1_conv
beq bit4_conv
cmp.w #16,d0
bcs bit8_conv
beq bit16_conv
bhi bit24_conv
*****************************************************************
* 1bit画像をコンバート *
*****************************************************************
bit1_conv:
movem.l d0-d1/d3-d7/a0-a4,-(sp)
move.w yoko(a6),d0 *横サイズ
move.w d0,d6 *端数を計算
andi.w #$0007,d6
lea.l pal_buf(a6),a3
movea.w line_byte1(a6),a4
moveq.l #0,d5
lsr.w #3,d0 *横/8-1
subq.w #1,d0
bit1_conv2:
move.w d0,d1 *横ループ
movea.l a0,a1
bit1_conv3:
move.b (a1)+,d3
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
dbra.w d1,bit1_conv3
move.w d6,d1 *端数があるか
beq bit1_conv5 *ない
subq.w #1,d1
move.b (a1)+,d3
bit1_conv4:
moveq.l #0,d4
add.b d3,d3
addx.b d4,d4
move.b d4,d5
add.b d5,d5
add.b d4,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
dbra.w d1,bit1_conv4
bit1_conv5:
bsr prt2 *変換ライン数表示
suba.l a4,a0 *変換元アドレス更新
dbra.w d7,bit1_conv2
movem.l (sp)+,d0-d1/d3-d7/a0-a4
rts
*****************************************************************
* 4bit画像をコンバート *
*****************************************************************
bit4_conv:
movem.l d0-d5/d7/a0-a5,-(sp)
lea.l pal_buf(a6),a3
movea.w line_byte1(a6),a4
move.w #$000f,d4
move.w yoko(a6),d0
btst.l #0,d0 *横ドットが奇数か?
bne bit4_conv4 *そう
lsr.w #1,d0 *横/2-1
subq.w #1,d0
bit4_conv2: *横ドット=偶数
move.w d0,d1
movea.l a0,a1
bit4_conv3
move.b (a1)+,d2
move.b d2,d3
lsr.b #4,d2 *上位4ビットを変換
and.w d4,d2
move.w d2,d5
add.w d5,d5
add.w d2,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
and.w d4,d3 *下位4ビットを変換
move.w d3,d5
add.w d5,d5
add.w d3,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
dbra.w d1,bit4_conv3
bsr prt2 *変換ライン数表示
suba.l a4,a0
dbra.w d7,bit4_conv2
movem.l (sp)+,d0-d5/d7/a0-a5
rts
bit4_conv4: *横ドット数=奇数
lsr.w #1,d0 *横/2-1
subq.w #1,d0
bit4_conv5
move.w d0,d1
movea.l a0,a1
bit4_conv6
move.b (a1)+,d2
move.b d2,d3
lsr.b #4,d2 *上位4ビットを変換
and.w d4,d2
move.w d2,d5
add.w d5,d5
add.w d2,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
and.w d4,d3 *下位4ビットを変換
move.w d3,d5
add.w d5,d5
add.w d3,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
dbra.w d1,bit4_conv6
move.b (a1)+,d2 *上位4ビットのみ変換
lsr.b #4,d2
and.w d4,d2
move.w d2,d5
add.w d5,d5
add.w d2,d5
lea.l (a3,d5.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
bsr prt2 *変換ライン数表示
suba.l a4,a0
dbra.w d7,bit4_conv5
movem.l (sp)+,d0-d5/d7/a0-a5
rts
*****************************************************************
* 8bit画像をコンバート *
*****************************************************************
bit8_conv:
movem.l d0-d2/d5-d7/a0-a5,-(sp)
lea.l pal_buf(a6),a3
move.w line_byte1(a6),a4
move.w yoko(a6),d5
subq.w #1,d5
bit8_conv1:
movea.l a0,a1
move.w d5,d6
bit8_conv2:
moveq.l #0,d1
move.b (a1)+,d1
move.w d1,d2
add.w d1,d1
add.w d2,d1
lea.l (a3,d1.w),a5
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
move.b (a5)+,(a2)+
dbra.w d6,bit8_conv2
bsr prt2 *変換ライン数表示
suba.l a4,a0
dbra.w d7,bit8_conv1
movem.l (sp)+,d0-d2/d5-d7/a0-a5
rts
*****************************************************************
* 16bit画像をコンバート *
*****************************************************************
bit16_conv:
bsr irohen16 *変換
tst.b nflg(a6)
beq bit16_conv9
bsr hanten *画像の上下反転
bit16_conv9:
rts
irohen16:
movem.l d0-d7/a0-a4,-(sp)
move.w #%0000_0000_0111_1100,d4
move.w #%1110_0000_0000_0011,d5
move.w #%0001_1111_0000_0000,d6
move.w yoko(a6),d0
subq.w #1,d0
subq.w #1,d1
movea.w d0,a3
movea.w line_byte1(a6),a4
irohen16_1:
move.w a3,d0
movea.l a0,a1
irohen16_2:
move.w (a1)+,d1
move.w d1,d2
move.w d1,d3
and.w d4,d1 *R
and.w d5,d2 *G
and.w d6,d3 *B
rol.w #1,d1
rol.w #6,d2
ror.w #5,d3
move.b d1,(a2)+
move.b d2,(a2)+
move.b d3,(a2)+
dbra.w d0,irohen16_2
bsr prt2 *変換ライン数表示
suba.l a4,a0
dbra.w d7,irohen16_1
movem.l (sp)+,d0-d7/a0-a4
rts
hanten:
movem.l d0-d4/a0-a3,-(sp)
movea.l a2,a0 *転送元1
move.w tate(a6),d0 *転送元2 (tate-1)*yoko*3
subq.w #1,d0
move.w yoko(a6),d1
move.w d1,d2
add.w d1,d1
add.w d2,d1
mulu.w d1,d0
adda.l d0,a2
moveq.l #0,d1 *1ライン上への差分 yoko*3
move.w yoko(a6),d1
move.w d1,d0
add.w d1,d1
add.w d0,d1
move.w tate(a6),d2 *縦ループ数
lsr.w #1,d2
subq.w #1,d2
move.w yoko(a6),d4
subq.w #1,d4
hanten1:
move.w d4,d3
movea.l a2,a3
hanten2:
move.b (a0),d0
move.b (a3),(a0)+
move.b d0,(a3)+
move.b (a0),d0
move.b (a3),(a0)+
move.b d0,(a3)+
move.b (a0),d0
move.b (a3),(a0)+
move.b d0,(a3)+
dbra.w d3,hanten2
suba.l d1,a2
dbra.w d2,hanten1
movem.l (sp)+,d0-d4/a0-a3
rts
*****************************************************************
* 24bit画像をコンバート *
*****************************************************************
bit24_conv:
movem.l d0-d3/d6-d7/a0-a3,-(sp)
movea.w line_byte1(a6),a3
move.w yoko(a6),d0 *横ループ
subq.w #1,d0
d_nashi:
move.w d0,d6
movea.l a0,a1
d_nashi1
move.b (a1)+,d1 *B
move.b (a1)+,d2 *G
move.b (a1)+,d3 *R
move.b d3,(a2)+
move.b d2,(a2)+
move.b d1,(a2)+
dbra.w d6,d_nashi1
bsr prt2 *変換ライン数表示
suba.l a3,a0
dbra.w d7,d_nashi
movem.l (sp)+,d0-d3/d6-d7/a0-a3
rts
*****************************************************************
* 展開 *
*****************************************************************
tenkai:
cmp.w #1,compress(a6)
beq tenkai8
tenkai4:
bsr rle4_tenkai
bra tenkai9
tenkai8:
bsr rle8_tenkai
tenkai9:
rts
*****************************************************************
* RLE4圧縮の展開 *
*****************************************************************
rle4_tenkai:
bsr compress_read *圧縮データ読み込む
movea.l a5,a0 *展開元
movea.l a5,a2 *展開元MAX
adda.l d6,a2
movea.l a2,a1 *展開先
move.l a1,d0 *万が一の展開先補正
btst.l #0,d0
beq rle4_tenkai_
addq.l #1,a1
rle4_tenkai_:
movea.l a1,a3 *取っておく
movea.l a1,a4
moveq.l #0,d2
moveq.l #0,d3
moveq.l #$f,d7
rle4_tenkai0:
cmpa.l a0,a2
bls rle4_tenkai9
moveq.l #0,d0
move.b (a0)+,d0
beq rle4_tenkai2
move.b (a0)+,d1
subq.w #1,d0
rle4_tenkai1:
rol.b #4,d1
bsr set
dbra.w d0,rle4_tenkai1
bra rle4_tenkai0
rle4_tenkai2:
moveq.l #0,d0
move.b (a0)+,d0
cmp.b #1,d0
bcs rle4_tenkai5
beq rle4_tenkai9
* cmp.b #2,d0 *無視
* bne rle4_tenkai2_
* addq.l #2,a0
* bra rle4_tenkai0
rle4_tenkai2_:
btst.l #0,d0 *偶数か
bne rle4_tenkai4 *違う
rle4_tenkai3:
lsr.w #1,d0
subq.w #1,d0
move.w d0,d5
rle4_tenkai3_:
move.b (a0)+,d1
rol.b #4,d1
bsr set
rol.b #4,d1
bsr set
dbra.w d0,rle4_tenkai3_
btst.l #0,d5
bne rle4_tenkai3__
addq.l #1,a0
rle4_tenkai3__:
bra rle4_tenkai0
rle4_tenkai4:
cmp.w #1,d0
bne rle4_tenkai4_
move.b (a0)+,d1
rol.b #4,d1
bsr set
addq.l #1,a0
bra rle4_tenkai0
rle4_tenkai4_:
lsr.w #1,d0
subq.w #1,d0
move.w d0,d5
rle4_tenkai4__:
move.b (a0)+,d1
rol.b #4,d1
bsr set
rol.b #4,d1
bsr set
dbra.w d0,rle4_tenkai4__
move.b (a0)+,d1
rol.b #4,d1
bsr set
btst.l #0,d5
beq rle4_tenkai4___
addq.l #1,a0
rle4_tenkai4___:
bra rle4_tenkai0
rle4_tenkai5:
tst.w d3
beq rle4_tenkai5_
bsr set
rle4_tenkai5_:
adda.w line_byte1(a6),a3 *展開アドレスの補正
movea.l a3,a1
bra rle4_tenkai0
rle4_tenkai9:
tst.w d3
beq rle4_tenkai9_
bsr set
rle4_tenkai9_:
bsr tenkai_move
rts
set:
move.w d1,d4
and.w d7,d4
rol.w #4,d2
or.w d4,d2
not.w d3
bne set9
move.b d2,(a1)+
moveq.l #0,d2
set9:
rts
*****************************************************************
* RLE8圧縮の展開 *
*****************************************************************
rle8_tenkai:
bsr compress_read *圧縮データ読み込む
movea.l a5,a0 *展開元
movea.l a5,a2 *展開元MAX
adda.l d6,a2
movea.l a2,a1 *展開先
move.l a1,d0 *万が一の展開先補正
btst.l #0,d0
beq rle8_tenkai_
addq.l #1,a1
rle8_tenkai_:
movea.l a1,a3 *取っておく
movea.l a1,a4 *展開先スペア
rle8_tenkai0:
cmpa.l a0,a2
bls rle8_tenkai9
moveq.l #0,d0
move.b (a0)+,d0
beq rle8_tenkai2
move.b (a0)+,d1
subq.w #1,d0
rle8_tenkai1:
move.b d1,(a1)+
dbra.w d0,rle8_tenkai1
bra rle8_tenkai0
rle8_tenkai2:
moveq.l #0,d0
move.b (a0)+,d0
cmp.b #1,d0
bcs rle8_tenkai5
beq rle8_tenkai9
* cmp.b #2,d0 *無視
* bne rle8_tenkai2_
* addq.l #2,a0
* bra rle8_tenkai0_
rle8_tenkai2_:
btst.l #0,d0 *偶数か
bne rle8_tenkai4 *違う
rle8_tenkai3:
subq.w #1,d0
rle8_tenkai3_:
move.b (a0)+,(a1)+
dbra.w d0,rle8_tenkai3_
bra rle8_tenkai0
rle8_tenkai4:
subq.w #1,d0
rle8_tenkai4_:
move.b (a0)+,(a1)+
dbra.w d0,rle8_tenkai4_
addq.l #1,a0
bra rle8_tenkai0
rle8_tenkai5:
adda.w line_byte1(a6),a3 *展開アドレスの補正
movea.l a3,a1
bra rle8_tenkai0
rle8_tenkai9:
bsr tenkai_move
rts
compress_read:
move.w #0,-(sp) *シークモード
move.l offbits(a6),-(sp) *オフセット
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0
bmi read_err
movea.l buff_addr(a6),a5 *圧縮データを読み込む
move.l fi_size(a6),d6
sub.l offbits(a6),d6
bsr file_read
rts
tenkai_move:
move.w line_byte1(a6),d0
mulu.w tate(a6),d0
lsr.l #2,d0
tenkai_move0:
move.l (a4)+,(a5)+
subq.l #1,d0
bne tenkai_move0
rts
*****************************************************************
* パレットデータの設定 *
*****************************************************************
pal_set:
cmp.w #8,iro(a6)
bls pal_set0
rts
pal_set0:
movea.l buff_addr(a6),a5 *パレットデータを読み込む
adda.l #14+64,a5
move.l offbits(a6),d6
sub.l #14+64,d6
bmi pal_set1
bsr file_read
pal_set1:
cmp.w #8,iro(a6)
bcs pal_set1_
pal_set1_:
movea.l pal_addr(a6),a0 *パレットの先頭アドレス
lea.l pal_buf(a6),a1 *パレットを設定するアドレス
move.w pal_cnt(a6),d0 *パレット数補正
cmp.w #256,d0
bls pal_set2
move.w #256,d0
pal_set2:
subq.w #1,d0
cmp.w #OS2v1,os_type(a6)
bne ps_win3
ps_os2v1:
move.b (a0)+,d1 *BGR
move.b (a0)+,d2
move.b (a0)+,d3
move.b d3,(a1)+ *RGB
move.b d2,(a1)+
move.b d1,(a1)+
dbra.w d0,ps_os2v1
rts
ps_win3:
move.b (a0)+,d1 *BGR
move.b (a0)+,d2
move.b (a0)+,d3
addq.l #1,a0
move.b d3,(a1)+ *RGB
move.b d2,(a1)+
move.b d1,(a1)+
dbra.w d0,ps_win3
rts
*****************************************************************
* IPRファイルの作成 *
*****************************************************************
ipr_set:
bsr ipr_name_set *IPR名の作成
lea.l arg3(a6),a0 *IPRファイル作成
bsr file_create
movea.l buff_addr(a6),a0
movea.l a0,a5
move.w yoko(a6),d0 *横
bsr ipr_set9
move.b #SPACE,(a0)+
move.w tate(a6),d0 *縦
bsr ipr_set9
move.b #SPACE,(a0)+
move.b #'0',(a0)+
move.b #SPACE,(a0)+
move.b #'0',(a0)+
sub.l a5,a0
move.l a0,d6 *ヘッダ書き込み
bsr file_write
move.w out_file(a6),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
ipr_set9:
move.l a0,-(sp)
ext.l d0
lea.l dec_buf(a6),a0
bsr bin2dec
bsr zero_keshi
movea.l a0,a1
movea.l (sp)+,a0
bsr strcpy
rts
*****************************************************************
* IPR名の作成 *
*****************************************************************
ipr_name_set:
lea.l arg2(a6),a1 *転送元
lea.l arg3(a6),a0 *転送先
bsr strcpy *ファイル名を複写する
lea.l arg3(a6),a0
lea.l cext1(pc),a1
bsr cheng_ext
rts
*****************************************************************
* セーブ名の作成 *
*****************************************************************
save_name_set:
lea.l filbuf(a6),a1 *転送元
lea.l 30(a1),a1
movea.l nameichi(a6),a0 *転送先
bsr strcpy *ファイル名を複写する
lea.l arg2(a6),a0
lea.l cext2(pc),a1
bsr cheng_ext
rts
*****************************************************************
* 拡張子を変更する *
*****************************************************************
cheng_ext:
* lea.l arg2(a6),a0 *ファイル名のアドレス
* lea.l cext(pc),a1
cheng_ext0:
cmp.b #".",(a0)+ *拡張子があるか
bne cheng_ext0
subq.l #1,a0 *行きすぎたから1つ戻る
cheng_ext1:
move.b (a1)+,(a0)+ *1文字転送
bne cheng_ext1 *終了コードまで繰り返す
cheng_ext2:
rts
*****************************************************************
* 表示関係 *
*****************************************************************
prt0: *表示バッファ初期化
movem.l d0/a0,-(sp)
lea.l prt_buff(a6),a0
moveq.l #96-1,d0
prt0_:
move.b #SPACE,(a0)+
dbra.w d0,prt0_
clr.b (a0)+
movem.l (sp)+,d0/a0
rts
prt1: *ファイル名とサイズ表示
movem.l d0/a0-a1,-(sp)
lea.l prt_buff(a6),a0
lea.l filbuf(a6),a1
lea.l 30(a1),a1
bsr strcpy
move.b #SPACE,(a0)
lea.l prt_buff(a6),a0 *位置合わせ
adda.l #22,a0
move.b #"(",(a0)+ *画像サイズ
move.w yoko(a6),d0
bsr dec_set
move.b #",",(a0)+
move.w tate(a6),d0
bsr dec_set
move.b #")",(a0)+
move.w iro(a6),d0 *bit数
bsr dec_set
lea.l bit_mes(pc),a1
bsr strcpy
lea.l crlf_mes(pc),a1
bsr strcpy
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0/a0-a1
rts
prt2: *変換ライン数表示
movem.l d0-d1/a0-a1,-(sp)
lea.l prt_buff(a6),a0
addq.w #1,line_cnt(a6)
move.w line_cnt(a6),d0
bsr dec_set
move.b #"/",(a0)+
move.w tate(a6),d0
bsr dec_set
lea.l henkan_mes(pc),a1
bsr strcpy
lea.l crlf_mes(pc),a1
bsr strcpy
IOCS _B_UP_S
moveq.l #42,d1
IOCS _B_RIGHT
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0-d1/a0-a1
rts
prt3: *'終了!'表示
movem.l d0-d1/a0-a1,-(sp)
lea.l prt_buff(a6),a0
lea.l syuryo_mes(pc),a1
bsr strcpy
lea.l crlf_mes(pc),a1
bsr strcpy
IOCS _B_UP_S
moveq.l #51,d1
IOCS _B_RIGHT
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0-d1/a0-a1
rts
dec_set
move.l a0,-(sp)
ext.l d0
lea.l dec_buf(a6),a0
bsr bin2dec
bsr zero_keshi
move.l (sp)+,a0
lea.l dec_buf(a6),a1
addq.l #6,a1
bsr strcpy
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* ファイルサイズの頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l dec_buf(a6),a0
moveq.l #9-1,d0
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
dbra.w d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0
bmi open_err
move.w d0,in_file(a6)
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w in_file(a6),-(sp)
DOS _READ
lea 10(sp),sp
tst.l d0
bmi read_err
cmp.l d6,d0
bne read_err
rts
*****************************************************************
* ファイル作成 *
*****************************************************************
file_create:
move.w #$20,-(sp) *ファイルCREATE
move.l a0,-(sp)
DOS _CREATE
addq.l #6,sp
tst.l d0
bmi create_err
move.w d0,out_file(a6)
rts
*****************************************************************
* ディスクに書き込む *
*****************************************************************
file_write:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w out_file(a6),-(sp)
DOS _WRITE
lea.l 10(sp),sp
tst.l d0
bmi write_err
cmp.l d6,d0
bne write_err
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff
move.l d0,buff_addr(a6) *バッファアドレス
move.l d1,buff_size(a6) *バッファサイズ
rts
*****************************************************************
* ファイルクローズ *
*****************************************************************
file_close1:
move.w in_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
file_close2:
move.w out_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(a6) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt(a6) *処理したファイルは0個か
bne file_cnt_chk1 *違う
lea.l no_file_mes(pc),a0
bsr mesput
file_cnt_chk1:
rts
*****************************************************************
* サポートしていないBMP *
*****************************************************************
no_support_err:
lea.l arg1(a6),a0
bsr mesput
lea.l no_support_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 色違い *
*****************************************************************
but_col_err:
lea.l arg1(a6),a0
bsr mesput
lea.l but_col_mes(pc),a0
bsr mesput
rts
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
lea.l arg1(a6),a0
bsr mesput
lea.l no_buff_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l in_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルエラー *
*****************************************************************
file_er:
move.w in_file(pc),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
lea.l arg1(a6),a0
bsr mesput
lea.l file_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg1(a6),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg1(a6),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 出力パス名エラー *
*****************************************************************
out_name_err:
lea.l out_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル作成エラー *
*****************************************************************
create_err:
lea.l arg2(a6),a0
bsr mesput
lea.l create_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル書き込みエラー *
*****************************************************************
write_err:
lea.l arg2(a6),a0
bsr mesput
lea.l write_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'BMP to RGB converter V0.01 by A.MUKAWA',CR,LF
.dc.b '機能:Win標準BMPファイルを 24bitベタのRGBファイルにコンバートします',CR,LF
.dc.b '用法:BMP2RGB [スイッチ] ファイル名 [セーブ先パス]',CR,LF
.dc.b CR,LF
.dc.b ' /H 識別ヘッダ"BM"をチェックしない',CR,LF
.dc.b ' /N 上下逆に表示される謎の16bitBMPのときに指定',CR,LF
.dc.b 0
in_mes:
.dc.b '入力ファイル',0
out_mes:
.dc.b '出力先パス',0
name_er_mes:
.dc.b '名の指定に間違いがあります!',CR,LF,0
file_er_mes:
.dc.b ' はBMPファイルではないようです!',CR,LF,0
but_col_mes:
.dc.b ' は未サポートの色数です!',CR,LF,0
no_support_mes:
.dc.b ' はサポートしていないBMPフォーマットです!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
no_buff_mes:
.dc.b ' の変換に必要なメモリがありません!',CR,LF,0
create_er_mes:
.dc.b ' が作れません!',CR,LF,0
write_er_mes:
.dc.b ' の書き込みエラーが発生しました!',CR,LF,0
no_file_mes:
.dc.b '変換できるファイルがありませんでした!',CR,LF,0
henkan_mes:
.dc.b ' 変換中',0
syuryo_mes:
.dc.b ' 終了!',0
bit_mes:
.dc.b 'bit',0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
sla_mes:
.dc.b '/',0
dext:
.dc.b '.BMP',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.BMP',0
cext1:
.dc.b '.IPR',0 *変更する拡張子
cext2:
.dc.b '.RGB',0 *変更する拡張子
*****************************************************************
* ワークエリア *
*****************************************************************
.offset 0
pal_buf:
.ds.b 256*3
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg1:
.ds.b 256 *入力ファイル名バッファ
arg2:
.ds.b 256 *出力ファイル名バッファ
arg3:
.ds.b 256 *IPRファイル名バッファ
cpathbuf
.ds.b 65 *カレントパス名バッファ
spathbuf
.ds.b 65 *セーブ先パス名バッファ
.even
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
gr_addr:
.ds.l 1 *画像データアドレス
fi_size:
.ds.l 1 *ファイルサイズ
offbits:
.ds.l 1 *画像データ迄のオフセット
pal_addr:
.ds.l 1 *パレットアドレス
os_type:
.ds.w 1 *OSのタイプ
pal_cnt:
.ds.w 1 *パレット数
iro:
.ds.w 1 *使用色数(BIT)
compress:
.ds.w 1 *圧縮モード
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
line_byte1:
.ds.w 1 *1ラインのバイト数(読み込み側)
line_byte2:
.ds.w 1 *1ラインのバイト数(書き込み側)
line_cnt:
.ds.w 1
file_cnt:
.ds.w 1
nameichi:
.ds.l 1
in_file:
.ds.w 1
out_file:
.ds.w 1
dec_buf:
.ds.b 10+1
prt_buff:
.ds.b 96+1
dflg:
.dc.b 1
nflg:
.dc.b 1
hflg:
.dc.b 1
skip_flg:
.dc.b 1
.even
WORK_SIZE:
.bss
.even
work:
.ds.b WORK_SIZE
my_stack:
.ds.l 1024
mysp:
.end start